﻿//EmailLogListener.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Logging
{
	using System;
	using System.Collections.Generic;
	using System.Net.Mail;

	using Ecng.Collections;

	/// <summary>
	/// Логгер, отсылающий данные на email. 
	/// </summary>
	public class EmailLogListener : LogListener
	{
		/// <summary>
		/// Создать <see cref="EmailLogListener"/>.
		/// </summary>
		/// <param name="from">Адрес, от имени которого будет отравлено сообщение.</param>
		/// <param name="to">Адрес, куда будет отравлено сообщение.</param>
		public EmailLogListener(string from, string to)
		{
			if (from.IsEmpty())
				throw new ArgumentNullException("from");

			if (to.IsEmpty())
				throw new ArgumentNullException("to");

			From = from;
			To = to;
		}

		/// <summary>
		/// Адрес, от имени которого будет отравлено сообщение.
		/// </summary>
		public string From { get; private set; }

		/// <summary>
		/// Адрес, куда будет отравлено сообщение.
		/// </summary>
		public string To { get; private set; }

		/// <summary>
		/// Создать email клиента.
		/// </summary>
		/// <returns>Email клиент.</returns>
		protected virtual SmtpClient CreateClient()
		{
			return new SmtpClient();
		}

		/// <summary>
		/// Создать email сообщение по полученным данным.
		/// </summary>
		/// <param name="message">Отладочное сообщение.</param>
		/// <returns>Email сообщение.</returns>
		protected virtual MailMessage CreateMail(LogMessage message)
		{
			if (message == null)
				throw new ArgumentNullException("message");

			return new MailMessage(From, To, message.Source.Name + " " + message.Level + " " + message.Time.ToString(TimeFormat), message.Message);
		}

		/// <summary>
		/// Записать сообщения.
		/// </summary>
		/// <param name="messages">Отладочные сообщения.</param>
		protected override void OnWriteMessages(IEnumerable<LogMessage> messages)
		{
			using (var email = CreateClient())
			{
				foreach (var message in messages)
					email.Send(CreateMail(message));
			}
		}
	}
}